package com.aspect;

import com.service.UserService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//MyAspect:切面
//before、after...方法:通知 前置通知(before)、后置通知(after)、环绕通知(around)、抛出通知(AfterThrowing)
//@Before:定义前置通知
//@After:定义后置通知
//@Around:定义环绕通知
//@AfterThrowing:定义抛出通知
//@AfterReturn:定义返回通知
//@Pointcut/规则:切入点
//JoinPoint:连接点
@Component
@Aspect
public class MyAspect2 {

    //@Pointcut:可以定义规则 其他地方可以引用它 可以被反复的调用
    @Pointcut("execution(* com.service.UserService.save(..) )")
    public void pointcut01(){}

    @Pointcut("execution(* com.service.GoodsService.delete(..) )")
    public void pointcut02(){}

    //JoinPoint:可以获取执行到的类Class信息、目标对象
    @Before(value = "!MyAspect2.pointcut02()")
    public void before(JoinPoint joinPoint){
        System.out.println("myaspect2 before");
    }
    //&&、||、!:与、或、非
    //JoinPoint:可以获取执行到的类Class信息、目标对象
    @After(value = "MyAspect2.pointcut01() && MyAspect2.pointcut02()")
    public void after(JoinPoint joinPoint){
        System.out.println("myaspect2 after");
    }

}
